home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 238_01 / mprint.c < prev    next >
Text File  |  1987-07-26  |  20KB  |  715 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <setjmp.h>
  4. #include <stdarg.h>
  5. #include <fcntl.h>
  6. #include <sys\types.h>
  7. #include <io.h>
  8. #include <sys\stat.h>
  9.  
  10. #define unreadc(ch) ungetc(ch,infile)
  11.  
  12. #define MAXPARM 9       /* max. number of parameters per function */
  13. #define MAXLPP 88       /* max. number of line per page */
  14. #define TBUFSIZ 16384   /* Text buffer size */
  15.  
  16. #define Boolean int
  17. #define TRUE 1
  18. #define FALSE 0
  19. #define ERROR (-1)
  20.  
  21. enum Ptype {            /* Parameter Type */
  22.     UNDEFINED, INTG, STRG
  23. };
  24.  
  25. struct funcdesc {       /* Function description entry */
  26.     char *name;         /* name in ASCII */
  27.     enum Ptype rettype; /* no return value or expected return type */
  28.     int nuparm;         /* number of paramters for the functions */
  29.     enum Ptype parmstype[MAXPARM];      /* definition parameter type */
  30. };
  31.  
  32. /* The function names must arrange in ascending order */
  33. /* and same as the order in EXECFUNC.ASM              */
  34. struct funcdesc FUNCTIONS[] =
  35.     { { "Arc1",     UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  36.       { "Arc2",     UNDEFINED, 5, { INTG, INTG, INTG, INTG, INTG } },
  37.       { "ArcPoint", UNDEFINED, 4, { INTG, INTG, INTG, INTG } },
  38.       { "BlockCopy",  INTG, 8,
  39.                     { INTG, INTG, INTG, INTG, INTG, INTG, INTG, INTG } },
  40.       { "BlockLoad",  INTG, 3, { INTG, INTG, STRG } },
  41.       { "BlockSave",  UNDEFINED, 5, { INTG, INTG, STRG, INTG, INTG } },
  42.       { "Box",      UNDEFINED, 6, { INTG, INTG, INTG, INTG, INTG, INTG } } ,
  43.       { "Circle",   UNDEFINED, 3, { INTG, INTG, INTG } } ,
  44.       { "CreateFrame", INTG, 2, { INTG, INTG } } ,
  45.       { "Dot",      UNDEFINED, 2, { INTG, INTG } } ,
  46.       { "Draw",     UNDEFINED, 3, { STRG, INTG, INTG } },
  47.       { "Earc1",    UNDEFINED, 5, { INTG, INTG, INTG, INTG, INTG } } ,
  48.       { "Earc2",    UNDEFINED, 6, { INTG, INTG, INTG, INTG, INTG, INTG } },
  49.       { "Ellipse",  UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  50.       { "EnvRsto",  UNDEFINED, 2, { INTG, INTG } },
  51.       { "EnvSave",  INTG, 1, { INTG } },
  52.       { "FillCircle", UNDEFINED, 3, { INTG, INTG, INTG } },
  53.       { "FillEllipse",UNDEFINED, 4, { INTG, INTG, INTG, INTG } },
  54.       { "HorzLine", UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  55.       { "Line",     UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  56.       { "LoadFont", INTG, 1, { STRG } } ,
  57.       { "NextXY",   UNDEFINED, 2, { INTG, INTG } },
  58.       { "PatternFill", UNDEFINED, 4, { INTG, INTG, STRG, INTG } },
  59.       { "PlotType", INTG, 1, { INTG } } ,
  60.       { "PrintFrame", UNDEFINED, 5, { INTG, STRG, INTG, INTG, INTG } } ,
  61.       { "PrintPage",  UNDEFINED, 0 },
  62.       { "ReadStr",    UNDEFINED, 7,
  63.                           { STRG, INTG, INTG, INTG, INTG, INTG, INTG } },
  64.       { "Rectangle",  UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  65.       { "RelOrg",   UNDEFINED, 2, { INTG, INTG } } ,
  66.       { "RemvFont", INTG, 1, { INTG } } ,
  67.       { "RemvFrame", INTG, 1, { INTG } } ,
  68.       { "ResetWin", UNDEFINED, 0 } ,
  69.       { "SelectFont",  INTG, 1, { INTG } },
  70.       { "SelectFrame", INTG, 1, { INTG } } ,
  71.       { "SetOrg",   UNDEFINED, 2, { INTG, INTG } } ,
  72.       { "SetStyle", UNDEFINED, 1, { INTG } } ,
  73.       { "SetWin",   UNDEFINED, 4, { INTG, INTG, INTG, INTG } } ,
  74.       { "SolidFill",   UNDEFINED, 2, { INTG, INTG } },
  75.       { "VertLine", UNDEFINED, 4, { INTG, INTG, INTG, INTG } },
  76.       { "WriteStr", UNDEFINED, 7, { INTG, INTG, INTG, INTG, STRG, INTG, INTG }},
  77.       { "XHLine",   INTG, 5, { INTG, INTG, INTG, INTG, INTG } }
  78.  };
  79.  
  80. /* total number of functions */
  81. #define NFUNC (sizeof(FUNCTIONS) / sizeof(struct funcdesc))
  82.  
  83.  
  84. /* Error message in C format string */
  85. char *ERRMSG[]= {
  86.     "Undefined Error Number\n",
  87.     "Variable/Function name expected\n",
  88.     "Variable name %s not found\n",
  89.     "Function name or expression expected\n",
  90.     "Function name %s not found\n",
  91.     "'(' expected after function name\n",
  92.     "Type if parameter %d is different from definition\n",
  93.     "')' expected after the parameters of a function\n",
  94.     "Less parameter than expected\n",
  95.     "End of string not detected before end of line\n",
  96.     "',' expected after a parameter\n",
  97.     "'C' or 'L' expected after '['\n",
  98.     "']' expected after a line or column specification\n",
  99.     "Idendifier Expected\n"
  100. };
  101.  
  102. /* total number of error messges */
  103. #define NUOFERROR (sizeof(ERRMSG) / sizeof(char *))
  104.  
  105. int PATTERN[]={
  106.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  107.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  108.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  109.     0x5555, 0xaaaa, 0x5555, 0xaaaa,
  110.     0x8888, 0x4444, 0x2222, 0x1111,
  111.     0x8888, 0x4444, 0x2222, 0x1111,
  112.     0x8888, 0x4444, 0x2222, 0x1111,
  113.     0x8888, 0x4444, 0x2222, 0x1111,
  114.     0x1111, 0x2222, 0x4444, 0x8888,
  115.     0x1111, 0x2222, 0x4444, 0x8888,
  116.     0x1111, 0x2222, 0x4444, 0x8888,
  117.     0x1111, 0x2222, 0x4444, 0x8888
  118. };
  119.  
  120. char LINE[160]; /* for variable line */
  121.  
  122. struct pval {   /* parameter record */
  123.     enum Ptype parmtype;
  124.     union {
  125.         int u_int;
  126.         char *u_strg;
  127.     } v;
  128. };
  129.  
  130. struct pval RETVAL, *expr();
  131.  
  132. /* Only first 12 characters of identifier is significant */
  133. /* Maximum number of characters in string(s) per function is 512 */
  134. char IDNAME[12], CHARS[512], *PSPTR;
  135.  
  136. #define NUOFVAR 21
  137.  
  138. int nuofvar=NUOFVAR;
  139. char VARNAME[NUOFVAR][12]={
  140.     "pattern1", "pattern2", "pattern3",
  141.     "line",
  142.     "font1", "font2", "font3", "font4",
  143.     "frame1", "frame2", "frame3",
  144.     "temp1", "temp2", "temp3",
  145.     "x1", "x2", "y1", "y2",
  146.     "env1", "env2", "env3"
  147. };
  148.  
  149. struct pval VARTABLE[NUOFVAR];
  150.  
  151. /* configurable parameters */
  152. int COL_OFFSET=0, ROW_OFFSET=0, LINE_HEIGHT=12, CHAR_WIDTH=12, LINEPERPAGE=66;
  153. int FRAME_WIDTH=960, FRAME_HEIGHT=792, VERT_DEN=0, HORZ_DEN=4; 
  154.  
  155. jmp_buf EOF_JMP, SYNERR_JMP;
  156.  
  157. int EOF_FLAG=0, TEXT_EOF=0, REMAIN=0;
  158. char TBUF[TBUFSIZ+1], *PAGE[MAXLPP], *PAGEPTR;
  159.  
  160. FILE *infile;   /* GRAD command file */
  161. int textfile;   /* text file */
  162.  
  163. main(argc,argv)
  164. int argc;
  165. char *argv[];
  166. {
  167.     char ch;
  168.     int ret, frame1;
  169.     FILE *fopen();
  170.  
  171.     /* Interpret the options if any */
  172.  
  173.     argv++;
  174.     while (argc-- > 1 && *(*argv)++=='-') {
  175.         if (**argv) {
  176.             ch= *(*argv)++;
  177.             ret=atoi(*argv);
  178.         } else {
  179.             ch=0;
  180.         }
  181.         switch(ch) {
  182.         case 'H':
  183.             FRAME_HEIGHT=ret;
  184.             break;
  185.         case 'W':
  186.             FRAME_WIDTH=ret;
  187.             break;
  188.         case 'c':
  189.             COL_OFFSET=ret;
  190.             break;
  191.         case 'd':
  192.             HORZ_DEN=ret & 0x0f; 
  193.             break;
  194.         case 'h':
  195.             LINE_HEIGHT=ret;
  196.             break;
  197.         case 'p':
  198.             if (ret > MAXLPP) {
  199.                 fprintf(stderr,"Max number of line per page is %d\n",MAXLPP);
  200.                 exit(1);
  201.             }
  202.             LINEPERPAGE=ret;
  203.             break;
  204.         case 'r':
  205.             ROW_OFFSET=ret;
  206.             break;
  207.         case 'v':
  208.             VERT_DEN=ret ? 0x10 : 0;
  209.             break;
  210.         case 'w':
  211.             CHAR_WIDTH=ret;
  212.             break;
  213.         default:
  214.             fprintf(stderr,"Unknow option -%c ** IGNORED **\n",ch);
  215.             break;
  216.         }
  217.         argv++;
  218.     }
  219.  
  220.     /* Any command line argument remain ? */
  221.     if ((argc < 1) && (argc > 2)) {
  222.         /* no more or too much */
  223.         fprintf(stderr,"Usage: mprint [options] commandfile [textfile]\n");
  224.         exit(1);
  225.     }
  226.     (*argv)--;
  227.  
  228.     /* open GRAD command file */
  229.     if ((infile=fopen(argv[0], "r")) == (FILE *) NULL) {
  230.         fprintf(stderr,"mprint: Command file not found\n");
  231.         exit(1);
  232.     }
  233.     if (argc==2) {
  234.         /* Open text file */
  235.         if ((textfile=open(argv[1],O_RDONLY | O_BINARY)) == ERROR) {
  236.             fprintf(stderr,"mprint: text file not found\n");
  237.             exit(1);
  238.         }
  239.     } else {
  240.         TEXT_EOF=TRUE;
  241.     }
  242.     GRADinit();         /* Initialize GRAD environemnt */
  243.     initvars();         /* Initialize my varaibles */
  244.     frame1=CreateFrame(FRAME_WIDTH,FRAME_HEIGHT);       /* Create Frame */
  245.     SelectFrame(frame1);        /* use it as default output */
  246.  
  247.     i